'use strict';

module.exports = {
    getNpmInfo,
    getNpmVersions,
    getNpmSemverVersions,
    getDefaultRegistry,
    getNpmLatestVersion
};

const axios = require('axios')
const urlJoin = require('url-join')
const semver = require('semver')

function getNpmInfo(npmName,registry) {
    if(!npmName)return null
    const registryUrl = registry || getDefaultRegistry()
    const npmInfoUrl = urlJoin(registryUrl,npmName)
    return axios.get(npmInfoUrl).then(res=>{
        if(res.status == 200){
            return res.data
        } else{
            return null
        }
    }).catch(e=>{
        return Promise.reject(e)
    })
}

function getDefaultRegistry(isOriginal = false) {
    return isOriginal ? 'https://registry.npmjs.org':'https://registry.npm.taobao.org'
}

async function getNpmVersions(npmName,registry) {
    const data = await getNpmInfo(npmName,registry)
    if(data) {
        return Object.keys(data.versions)
    } else {
        return []
    }
}

function getSemverVersions(baseVersion,versions) {
    return versions
    .filter(version=>semver.satisfies(version,`^${baseVersion}`))
    .sort((a,b)=>semver.gt(b,a))
}

async function getNpmSemverVersions(baseVersion,npmName,registry) {
    const versions = await getNpmVersions(npmName,registry)
    const newVersions = getSemverVersions(baseVersion,versions)
    if(newVersions && newVersions.length>0) {
        return newVersions[0]
    }
}

async function getNpmLatestVersion(npmName, registry) {
    const versions = await getNpmVersions(npmName, registry)
    if(versions) {
        return versions.sort((a,b)=>semver.gt(b,a))[0]
    } else {
        return null
    }
}